package day0112;

import org.junit.Test;

public class Demo {
	@Test
	public void test1() {
		
		Add add = new Add(3,5);
		//如果子类没有重写覆盖父类方法，那么调用的就是父类的方法
		//如果子类重写覆盖了父类的方法，那么调用的就是子类重写的方法
		int result = add.getResult(); //此处调用的是子类重写的方法
		System.out.println(result);
	}
	
	@Test
	public void test2() {
		//声明成父类对象，new子类对象
		//你继承什么你就是什么，学生就是人，加法是计算
		Cal cal = new Add(3,5);
		//Type mismatch: cannot convert from Cal to Add
		//Add add = new Cal(3,5);   不能声明子类new父类
		int result = cal.getResult(); //调用的事子类的getResult()方法
		System.out.println(result);  
		
		//多态：多种类型
		//声明成父类类型，可以指向不同的子类形态
		cal = new Sub(5,3);
		int result2 = cal.getResult();
		System.out.println(result2);
		
		//抽象类不能实例化
		//Cannot instantiate the type Cal
		//Cal cal2 = new Cal();
	}
	
	@Test
	public void test3() {
		
		Add add = new Add(6,3);
		show(add);
		Sub sub = new Sub(6,3);
		show(sub);
		Div div = new Div(6,3);
		show(div);
	}
	
	//为什么要声明父类，因为如果声明子类，每个运算都得写一个方法
	//直接声明父类，只需要写一个方法
	private void show(Cal cal) {
		System.out.println(cal.getResult());
	}
	//声明子类的话每个计算方法都得写
//	private void show(Div div) {
//		System.out.println(div.getResult());
//	}
//
//	private void show(Sub sub) {
//		System.out.println(sub.getResult());
//	}
//
//	private void show(Add add) {
//		System.out.println(add.getResult());
//	}

	
}
